//package com.msw.jcwapi.common.token;
//
//import com.msw.jcwapi.common.Constants;
//import org.springframework.stereotype.Component;
//
//import java.util.ArrayList;
//import java.util.List;
//import java.util.UUID;
//import java.util.concurrent.ConcurrentHashMap;
//import java.util.concurrent.Executors;
//import java.util.concurrent.ScheduledExecutorService;
//import java.util.concurrent.TimeUnit;
//import java.util.concurrent.locks.ReentrantLock;
//
//@Component
//
//public class TokenCache {
//
//    // 定义一个ConcurrentHashMap来存储token及其过期时间
//    private final ConcurrentHashMap<String, CacheEntry> cache = new ConcurrentHashMap<>();
//    // 使用一个ScheduledExecutorService来定期检查缓存
//    private final ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1);
//    // 定义一个锁来确保线程安全地修改缓存
//    private final ReentrantLock lock = new ReentrantLock();
//
//    // 定义一个内部类来表示缓存条目
//    private static class CacheEntry {
//        String token;
//        long expiryTime; // 存储过期时间，单位为毫秒
//        SysUser sysUser;
//        //使用的是UUID
//        CacheEntry(String token, long expiryTime) {
//            this.token = token;
//            this.expiryTime = expiryTime;
//        }
//        //使用的是UUID
//        CacheEntry(String token,SysUser sysUser, long expiryTime) {
//            this.token = token;
//            this.sysUser = sysUser;
//            this.expiryTime = expiryTime;
//        }
//    }
//
//    // 构造函数，启动定时任务
//    public TokenCache() {
//        // 每一分钟检查一次缓存中的条目，自己项目可以随便一点
//        scheduler.scheduleAtFixedRate(this::cleanupExpiredTokens, 1, 1, TimeUnit.MINUTES);
//    }
//
//    // 设置token，并指定过期时间（单位：毫秒）
//
//    /**
//     *
//     * @param type 用户类型
//     * @param sysUser 用户信息
//     * @param expiryDuration 过期时间
//     * @param timeUnit 时间单位
//     */
//    public String setToken(String type, SysUser sysUser, long expiryDuration, TimeUnit timeUnit) {
//        //过期时间设定
//        long expiryTime = System.currentTimeMillis() + timeUnit.toMillis(expiryDuration);
//        String token = UUID.randomUUID().toString().replace("-", "");
//        if(type.equals(Constants.AUTHORIZATION_WEIXIN)){//微信用户
//            token=Constants.AUTHORIZATION_WEIXIN + ":" + token;//微信前缀
//            //key+value
//            //存放的是token与用户信息及过期时间
//            cache.put(token, new CacheEntry(token,sysUser, expiryTime));
//
//        }else if(type.equals("web")){
//            //暂时未做
//        }else {
//            //暂时未做
//        }
//       return token;
//    }
//
//    // 获取token，如果token存在且未过期则返回，否则返回null
//    public String getToken(String key) {
//        CacheEntry entry = cache.get(key);
//        if (entry != null && System.currentTimeMillis() < entry.expiryTime) {
//            return entry.token;
//        }
//        // 如果token过期，则移除并返回null
//        removeExpiredToken(key);
//        return null;
//    }
//
//    // 移除指定key的token，无论是否过期
//    public void removeToken(String key) {
//        cache.remove(key);
//    }
//
//    // 获取所有未过期的token
//    public List<SysUser> getAllValidTokens() {
//        List<SysUser> validTokens = new ArrayList<>();
//        long currentTime = System.currentTimeMillis();
//
//        for (CacheEntry entry : cache.values()) {
//            if (currentTime < entry.expiryTime) {
//                validTokens.add(entry.sysUser);
//            }
//        }
//
//        return validTokens;
//    }
//
//    // 检查并移除所有过期的token
//    private void cleanupExpiredTokens() {
//        lock.lock();
//        try {
//            long currentTime = System.currentTimeMillis();
//            cache.entrySet().removeIf(entry -> currentTime > entry.getValue().expiryTime);
//        } finally {
//            lock.unlock();
//        }
//    }
//
//    // 尝试移除一个可能已经过期的token（由getToken方法调用）
//    private void removeExpiredToken(String key) {
//        CacheEntry entry = cache.get(key);
//        if (entry != null && System.currentTimeMillis() > entry.expiryTime) {
//            cache.remove(key);
//        }
//    }
//
//    // 关闭定时任务，释放资源
//    public void shutdown() {
//        scheduler.shutdown();
//        try {
//            if (!scheduler.awaitTermination(60, TimeUnit.SECONDS)) {
//                scheduler.shutdownNow();
//            }
//        } catch (InterruptedException e) {
//            scheduler.shutdownNow();
//        }
//    }
////
////    public static void main(String[] args) throws InterruptedException {
////        TokenCache tokenCache = new TokenCache();
////
////        // 设置一个token，有效期为5秒
////        tokenCache.setToken("user1", "token123", 5, TimeUnit.SECONDS);
////
////        // 获取token
////        System.out.println("Token: " + tokenCache.getToken("user1")); // 应该输出: Token: token123
////
////        // 等待6秒，使token过期
////        Thread.sleep(6000);
////
////        // 尝试获取已过期的token
////        System.out.println("Token after expiry: " + tokenCache.getToken("user1")); // 应该输出: Token after expiry: null
////
////        // 关闭缓存
////        tokenCache.shutdown();
////    }
//
//}